/*装饰器模式是一种结构型设计模式，它允许在不改变对象结构的情况下，通过将对象包装在装饰器类中来动态地添加新的行为和功能。 
在装饰器模式中，有一个核心组件（被装饰对象），它定义了基本的功能。然后，有一系列装饰器类，它们实现了相同的接口，
并且将核心组件作为构造函数的参数。这些装饰器类可以在运行时动态地添加新的功能，而不影响核心组件。

以下是一个简单的装饰器模式的实现示例：*/


// 定义核心组件
function Coffee() {
  this.cost = function() {
    return 10;
  };
}

// 定义装饰器类
function MilkDecorator(coffee) {
  this.cost = function() {
    return coffee.cost() + 2;
  };
}

function SugarDecorator(coffee) {
  this.cost = function() {
    return coffee.cost() + 1;
  };
}

// 使用装饰器
var coffee = new Coffee();
coffee = new MilkDecorator(coffee);
coffee = new SugarDecorator(coffee);
console.log(coffee.cost()); // 输出：13

/*在上述案例中，我们有一个核心组件 Coffee，它定义了基本的功能。然后，我们定义了两个装饰器类 MilkDecorator 和 SugarDecorator，
它们都实现了相同的接口，并将核心组件作为构造函数的参数。这样，我们可以通过创建不同的装饰器对象来动态地添加新的功能。

在使用装饰器时，我们首先创建一个核心组件对象 coffee，然后将其传递给装饰器类的构造函数，以创建装饰后的对象。
最后，我们可以调用装饰后的对象的方法，从而获得具有新功能的结果。在上述案例中，coffee.cost() 方法返回的是包含牛奶和糖的咖啡的总成本。*/